package com.example.websocketdemo.controller;

import com.example.websocketdemo.config.ChatMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.annotation.SendToUser;
import org.springframework.stereotype.Controller;

import java.security.Principal;
import java.time.LocalDateTime;

/**
 * @author Cary
 * @date 2025-03-26
 */
@Controller
@Slf4j
public class HelloController {
  @Autowired
  private SimpMessagingTemplate messagingTemplate;

  /**
   * 广播发送消息
   *
   * @param content
   * @return
   */
  @MessageMapping("/sendToAll")
//  @SendTo("/notice")
  public String sayHello(String content) {
    System.out.println("[服务器]收到客户端的消息：" + content);
    messagingTemplate.convertAndSend("/notice", "resp: " + content);
    return "resp: " + content + " | " + LocalDateTime.now();
  }

  // 点对点消息示例1 - 使用@SendToUser，Spring 会自动将目的地转换为 /user/{sessionId}/queue/greeting，仅会发送给自己，不能发送指定用户，常用于个人通知
  @MessageMapping("/sendToUser")
  @SendToUser("/queue/greeting")
  public String sendToUser(String message) {
    return message;
  }

  /**
   * 点对点发送消息
   * 模拟 张三 给 李四 发送消息场景
   *
   * @param principal 当前用户
   * @param name      接收消息的用户
   * @param message   消息内容
   */
  @MessageMapping("/sendToUser/{username}")
  public void sendToUser(Principal principal, @DestinationVariable String username, String message) {
    String sender = principal.getName(); // 发送人
    log.info("发送人:{}; 接收人:{}", sender, username);
    messagingTemplate.convertAndSendToUser(username, "/queue/greeting", new ChatMessage()
        .setSender(sender)
        .setContent(message));
  }
}
